﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraBars;
using DevExpress.Utils;
using DevExpress.UserSkins;
using DevExpress.Skins;
using DevExpress.LookAndFeel;
using DevExpress.XtraBars.Helpers;
using DevExpress.XtraEditors;
using DevExpress.XtraTab;
using System.IO;
using BLL;
using DAL;
using NLog;


namespace QLTTTH
{
    public partial class frmMain : DevExpress.XtraBars.Ribbon.RibbonForm
    {
        protected Logger logger = LogManager.GetCurrentClassLogger();

        public frmMain()
        {
            InitializeComponent();
        }

        DefaultLookAndFeel defaultSkin;
        private void SetSkinForForm()
        {
            defaultSkin = new DefaultLookAndFeel();
            string filePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\QLTTTH\Skins\";
            string fileName =  Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\QLTTTH\Skins\Skin.txt";
            if (File.Exists(fileName) == false)
            {
                defaultSkin.LookAndFeel.SetSkinStyle("Liquid Sky");
                Directory.CreateDirectory(filePath);
                File.Create(fileName);

            }
            else
            {
                StreamReader objRead = new StreamReader(fileName, false);
                defaultSkin.LookAndFeel.SetSkinStyle(objRead.ReadLine());
                objRead.Close();
            }
            SkinHelper.InitSkinPopupMenu(menuSkin);
            SkinHelper.InitSkinGallery(rgiSkin);
        }

        private void tabContent_CloseButtonClick(object sender, EventArgs e)
        {
            if (xtabContent.SelectedTabPageIndex != 0)
            {
                int index = xtabContent.SelectedTabPageIndex;
                xtabContent.TabPages.RemoveAt(index);
                xtabContent.SelectedTabPageIndex = index - 1;
            }
        }

        private void AddNewTabPage(string strTabName, UserControl ucContent)
        {
            DevExpress.XtraTab.XtraTabPage newTabPage = new DevExpress.XtraTab.XtraTabPage();
            newTabPage.Name = "xtraTabPage" + strTabName;
            // ------------- If exist tabpage then exit----------------
            foreach (DevExpress.XtraTab.XtraTabPage tabPage in xtabContent.TabPages)
            {
                if (tabPage.Name == newTabPage.Name)
                {
                    xtabContent.SelectedTabPage = tabPage;
                    return;
                }
            }
            //-------------- add tab page to tab control -----------
            xtabContent.TabPages.Add(newTabPage);
            xtabContent.SelectedTabPageIndex = xtabContent.TabPages.Count - 1;
            //-------------- set value for properties ---------------
            newTabPage.Appearance.PageClient.BackColor = System.Drawing.Color.Cyan;
            newTabPage.Appearance.PageClient.Options.UseBackColor = true;
            //-------------- if add control of tab page exist then program remove to newTabPage -------
            ucContent.Dock = DockStyle.Fill;
            newTabPage.Controls.Add(ucContent);
            newTabPage.ShowCloseButton = DevExpress.Utils.DefaultBoolean.True;
            newTabPage.Size = new System.Drawing.Size(929, 458);
            newTabPage.Text = strTabName;
        }

        private void frmMain_Load(object sender, EventArgs e)
        {
            SetSkinForForm();
            lblUsername.Caption = "Tài khoản: " + username;
            btnDangNhap.Enabled = bbiDangNhap.Enabled = !isLogin;
            btnDangXuat.Enabled = bbiDangXuat.Enabled = btnSignOut.Enabled = isLogin;
            AnChucNang();
        }

        private void btnTroGiup_ItemClick(object sender, ItemClickEventArgs e)
        {
            string fileName = Application.StartupPath + @"\Help.chm";
            Help.ShowHelp(this, fileName);
        }

        private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            SaveSkin();
        }

        private void SaveSkin()
        {
            try
            {
                string skinName = defaultSkin.LookAndFeel.SkinName;
                string fileName = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\QLTTTH\Skins\Skin.txt";
                if (File.Exists(fileName))
                {
                    StreamWriter objWrite = new StreamWriter(fileName, false);
                    objWrite.WriteLine(skinName);
                    objWrite.Close();
                }

            }
            catch (Exception ex)
            {
                logger.Error(ex.Message);
            }
        }

        private void btnThoat_ItemClick(object sender, ItemClickEventArgs e)
        {
            if (XtraMessageBox.Show("Bạn muốn thoát chương trình", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                Application.Exit();
            }
        }

        private void btnMonHoc_ItemClick(object sender, ItemClickEventArgs e)
        {
            UCMonHoc mh = new UCMonHoc();
            AddNewTabPage("Môn học", mh);
        }

        private void btnNhanVien_ItemClick(object sender, ItemClickEventArgs e)
        {
            UCNhanVien _nvien = new UCNhanVien();
            AddNewTabPage("Nhân viên", _nvien);
        }

        private void btnHocVien_ItemClick(object sender, ItemClickEventArgs e)
        {
            UCHocVien hv = new UCHocVien();
            AddNewTabPage("Học viên", hv);
        }

        private void btnPhonHoc_ItemClick(object sender, ItemClickEventArgs e)
        {
            UCPhongHoc ph = new UCPhongHoc();
            AddNewTabPage("Phòng học", ph);
        }

        private void btnThietBi_ItemClick(object sender, ItemClickEventArgs e)
        {
            UCThietBi tb = new UCThietBi();
            AddNewTabPage("Thiết bị", tb);
        }

        private void btnLopHoc_ItemClick(object sender, ItemClickEventArgs e)
        {
            UCLopHoc lh = new UCLopHoc();
            AddNewTabPage("Lớp học", lh);
        }

        private void btnKhoaHoc_ItemClick(object sender, ItemClickEventArgs e)
        {
            UCKhoaHoc kh = new UCKhoaHoc();
            AddNewTabPage("Khóa học", kh);
        }

        private void btnGiaoVien_ItemClick(object sender, ItemClickEventArgs e)
        {
            UCGiaoVien gv = new UCGiaoVien();
            AddNewTabPage("Giáo viên", gv);
        }

        private void btnSaoLuu_ItemClick(object sender, ItemClickEventArgs e)
        {
            #region sao lưu dữ liệu
            string path = @"D:\QLTTTH\Backup";
            string fileName = DateTime.Now.ToString("yyyyMMddHHmmss");
            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }

            var dialog = new SaveFileDialog();
            dialog.Title = "Sao lưu cơ sở dữ liệu";
            dialog.Filter = "Database Backup|*.BAK";
            dialog.InitialDirectory = path;
            dialog.FileName = fileName + ".BAK";
            if (dialog.ShowDialog() == DialogResult.OK)
            {
                var aResult = BackupManager.BackupDatabase(dialog.FileName);
                if (aResult.Success)
                {
                    XtraMessageBox.Show("Sao lưu cơ sở dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    XtraMessageBox.Show("Sao lưu cơ sở dữ liệu thất bại", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    Log(aResult);
                }
            }

            #endregion
        }

        private void Log(ActionResult aResult)
        {
            foreach (var ex in aResult.Exceptions)
            {
                logger.Error(ex);
            }
        }

        private void btnPhucHoi_ItemClick(object sender, ItemClickEventArgs e)
        {
            frmBackupDatabase frm = new frmBackupDatabase();
            frm.ShowDialog();
        }

        private void btnThoiKhoaBieu_ItemClick(object sender, ItemClickEventArgs e)
        {
            UCThoiKhoaBieu tkb = new UCThoiKhoaBieu();
            AddNewTabPage("Thời khóa biểu", tkb);
        }

        private void btnLogViewer_ItemClick(object sender, ItemClickEventArgs e)
        {
            frmLogViewer frm = new frmLogViewer();
            frm.ShowDialog();
        }

        private void btnChungChi_ItemClick(object sender, ItemClickEventArgs e)
        {
            UCChungChi chungchi = new UCChungChi();
            AddNewTabPage("Chứng chỉ", chungchi);
        }

        private void btnDiemThi_ItemClick(object sender, ItemClickEventArgs e)
        {
            UCDiemThi dt = new UCDiemThi();
            AddNewTabPage("Điểm thi", dt);
        }

        private void btnLichThi_ItemClick(object sender, ItemClickEventArgs e)
        {
            UCLichthi lt = new UCLichthi();
            AddNewTabPage("Lich thi", lt);
        }

        private void btnDangNhap_ItemClick(object sender, ItemClickEventArgs e)
        {
            var frm = new frmDangNhap();
            frm.ShowDialog();
            if (frm.IsLogin)
            {
                isLogin = frm.IsLogin;
                username = frm.TenDangNhap;
                lblUsername.Caption = "Tài khoản: " + username;
                logger.Info("Tài khoản " + username + " đã đăng nhập vào hệ thống");
                btnDangXuat.Enabled = bbiDangXuat.Enabled = btnSignOut.Enabled = isLogin;
                btnDangNhap.Enabled = bbiDangNhap.Enabled = !isLogin;
                var lstq = QuyenManager.LayDanhSachQuyen(username);
                if (lstq.Success)
                {
                    foreach (Quyen q in lstq.Result)
                    {
                        BatChucNang(q.TenQuyen, true);
                    }
                }

            }
        }

        private void btnDangXuat_ItemClick(object sender, ItemClickEventArgs e)
        {
            if (isLogin && XtraMessageBox.Show("Thoát khỏi tài khoản " + username, "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                logger.Info("Tài khoản " + username + " đã đăng xuất khỏi hệ thống");
                isLogin = false;
                username = "Khách";
                lblUsername.Caption = "Tài khoản: " + username;
                btnDangNhap.Enabled = bbiDangNhap.Enabled = !isLogin;
                btnDangXuat.Enabled = bbiDangXuat.Enabled = btnSignOut.Enabled = isLogin;
                AnChucNang();

                xtabContent.TabPages.Clear();
                xtabContent.TabPages.Add(xtabPageHome);
            }
        }

        private void AnChucNang()
        {
            var lst = QuyenManager.LayDanhSachQuyen().Result;
            foreach (Quyen q in lst)
                BatChucNang(q.TenQuyen, false);
        }

        private void BatChucNang(string quyen, bool t)
        {
            switch (quyen)
            {
                case "Tài khoản":
                    btnPhanQuyen.Enabled = t;
                    break;
                case "Sao lưu":
                    btnSaoLuu.Enabled = t;
                    bbiSaoLuu.Enabled = t;
                    break;
                case "Khôi phục":
                    btnPhucHoi.Enabled = t;
                    bbiKhoiPhuc.Enabled = t;
                    break;
                case "Quản lý nhân viên":
                    btnNhanVien.Enabled = t;
                    break;
                case "Quản lý giáo viên":
                    btnGiaoVien.Enabled = t;
                    break;
                case "Quản lý phòng học":
                    btnPhonHoc.Enabled = t;
                    break;
                case "Quản lý thiết bị":
                    btnThietBi.Enabled = t;
                    break;
                case "Quản lý khóa học":
                    btnKhoaHoc.Enabled = t;
                    break;
                case "Quản lý môn học":
                    btnMonHoc.Enabled = t;
                    break;
                case "Quản lý lớp học":
                    btnLopHoc.Enabled = t;
                    break;
                case "Quản lý chứng chỉ":
                    btnChungChi.Enabled = t;
                    break;
                case "Quản lý điểm thi":
                    btnDiemThi.Enabled = t;
                    break;
                case "Quản lý kỳ thi":
                    btnKyThi.Enabled = t;
                    break;
                case "Quản lý thời khóa biểu":
                    btnThoiKhoaBieu.Enabled = t;
                    break;
                case "Quản lý lịch thi":
                    btnLichThi.Enabled = t;
                    break;
                case "Quản lý học viên":
                    btnHocVien.Enabled = t;
                    break;
                case "Quản lý học phí":
                    btnHocPhi.Enabled = t;
                    break;
                case "Đổi mật khẩu":
                    btnDoiMK.Enabled = t;
                    break;
                case "Xem nhật ký":
                    btnLogViewer.Enabled = t;
                    bbiNhatKy.Enabled = t;
                    break;
                case "Quản lý thống kê":
                    btnHocPhiBC.Enabled = t;
                    btnDiemThiBC.Enabled = t;
                    break;
                case "Quản lý báo cáo":
                    btnHocPhiBC.Enabled = t;
                    btnDiemThiBC.Enabled = t;
                    break;
            }
        }

        private bool isLogin = false;
        private string username = "Khách";

        private void btnThongTin_ItemClick(object sender, ItemClickEventArgs e)
        {
            var frm = new frmAbout();
            frm.ShowDialog();
        }

        private void btnDoiMK_ItemClick(object sender, ItemClickEventArgs e)
        {
            var frm = new frmDoiMatKhau();
            frm.Username = username;
            frm.ShowDialog();
        }

        private void btnHocPhi_ItemClick(object sender, ItemClickEventArgs e)
        {
            var hp = new UCHocPhi();
            AddNewTabPage("Học phí", hp);
        }

        private void btnPhanQuyen_ItemClick(object sender, ItemClickEventArgs e)
        {
            var pq = new UCPhanQuyen();
            AddNewTabPage("Phân quyền", pq);
        }

        private void btnKyThi_ItemClick(object sender, ItemClickEventArgs e)
        {
            var kt = new UCKyThi();
            AddNewTabPage("Kỳ thi", kt);
        }

        private void btnHocPhiBC_ItemClick(object sender, ItemClickEventArgs e)
        {
            var hpbc = new UCHocPhiBC();
            AddNewTabPage("Báo cáo học phí", hpbc);
        }

        private void btnDiemThiBC_ItemClick(object sender, ItemClickEventArgs e)
        {
            var dtbc = new UCDiemThiBC();
            AddNewTabPage("Báo cáo điểm thi", dtbc);
        }

    }
}
